public class MyCircularQueue {
    // 存储队列元素的数组
    public int[] elem;
    // 当前队列中已使用的元素数量
    public int usedSize;

    // 队首指针，指向队列的第一个元素
    public int front;
    // 队尾指针，指向队列最后一个元素的下一个位置
    public int rear;

    public MyCircularQueue(int k) {
        elem = new int[k];  // 创建大小为k的数组来存储队列元素
    }

    // 入队列
    public boolean enQueue(int value) {
        if(isFull()) {  // 检查队列是否已满
            return false;  // 队列已满，无法入队
        }
        elem[rear] = value;  // 将新元素放入队尾位置
        rear = (rear+1)%elem.length;  // 循环移动rear指针
        usedSize++;  // 增加已使用大小计数
        return true;  // 入队成功
    }

    // 出队列
    public boolean deQueue() {
        if(isEmpty()) {  // 检查队列是否为空
            return false;  // 队列为空，无法出队
        }
        front = (front+1)%elem.length;  // 循环移动front指针
        usedSize--;  // 减少已使用大小计数
        return true;  // 出队成功
    }

    // 获取队头元素
    public int Front() {
        if(isEmpty()) {
            return -1;  // 队列为空，返回-1表示错误
        }
        return elem[front];  // 返回front指针指向的元素
    }

    // 获取队尾元素
    public int Rear() {
        if(isEmpty()) {
            return -1;  // 队列为空，返回-1表示错误
        }
        // 计算队尾元素的位置
        // 如果rear为0，则队尾元素在数组末尾；否则是rear-1的位置
        int index = (rear == 0) ? elem.length-1 : rear-1;
        return elem[index];  // 返回队尾元素
    }

    // 判断队列是否为空
    public boolean isEmpty() {
        return usedSize == 0;  // 已使用大小为0即为空
    }

    // 判断队列是否已满
    public boolean isFull() {
        return usedSize == elem.length;  // 已使用大小等于数组长度即为满
    }
}

